import 'reflect-metadata'
import Koa from 'koa'
import cors from 'koa2-cors'

import { WXAPPSECRET } from '@/config'

import { loggerMiddleware } from '@/middleware/logger'
import { responseHandler, loginStatusHandler } from '@/middleware/response'
import { koaBody } from 'koa-body'
import jwt from 'koa-jwt'

// 加载环境变量
import dotenv from 'dotenv'
dotenv.config({ path: `.env.${process.env.NODE_ENV}` })

import { unprotectedRouter, protectedRouter } from '@/routes'
import { AppDataSource } from '@/config/dataSource'

async function bootstrap() {
    try {
        // 1. 首先初始化数据库连接
        await AppDataSource.initialize()

        // 2. 然后创建 Koa 应用
        const app = new Koa()

        // 使用 koa2-cors 中间件
        app.use(cors())

        // 日志处理
        app.use(loggerMiddleware)

        // 登录态设置
        app.use(loginStatusHandler)

        // 响应处理
        app.use(responseHandler)

        // 解析POST请求
        app.use(koaBody())

        // 无需 JWT TOKEN 即可访问
        app.use(unprotectedRouter.routes()).use(unprotectedRouter.allowedMethods())

        // 注册 JWT 中间件
        app.use(jwt({ secret: WXAPPSECRET }))

        // 需 JWT TOKEN 即可访问
        app.use(protectedRouter.routes()).use(protectedRouter.allowedMethods())

        // 启动服务器
        app.listen(process.env.PORT, () => {
            console.log(
                `停车难小程序服务器正在运行${process.env.NODE_ENV}，端口为${process.env.PORT}`
            )
        })
    } catch (error) {
        console.error('启动失败:', error)
    }
}

bootstrap()
